﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Triagem
    {
        public long TriagemId { get; set; }
        public double? Altura { get; set; }
        public int ConsultaId { get; set; }
        public double? FrequenciaCardiaca { get; set; }
        public string Observacoes { get; set; }
        public double? Peso { get; set; }
        public double? PressaoArterial { get; set; }
        public double? Temperatura { get; set; }
        private RzCorportativo.DataAccess.Triagem model { get; set; }
        public bool IsNew { get { return this.TriagemId == 0; } }

        public static Triagem CreateInstace(int triagemId)
        {
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            var p = db.Triagem.Where(w => w.TriagemId == triagemId).FirstOrDefault();
            Triagem item = new Triagem();
            if (p != null)
                item = item.CreateTriagem(p);
            return item;
        }

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                this.model = new RzCorportativo.DataAccess.Triagem();
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.TriagemId = this.model.TriagemId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Triagem Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToTriagem(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Triagem Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Triagem CreateModel(RZCorporativoEntities entity)
        {
            RzCorportativo.DataAccess.Triagem triagem = new RzCorportativo.DataAccess.Triagem();
            if (!this.IsNew)
            {
                triagem = entity.Triagem.Where(w => w.TriagemId == this.TriagemId).FirstOrDefault();
                if (triagem == null)
                    throw new Exception("Código inválido");
            }

            triagem.TriagemId = this.TriagemId;
            triagem.Temperatura = this.Temperatura;
            triagem.PressaoArterial = this.PressaoArterial;
            triagem.Peso = this.Peso;
            triagem.Observacoes = this.Observacoes;
            triagem.FrequenciaCardiaca = this.FrequenciaCardiaca;
            triagem.ConsultaId = this.ConsultaId;
            triagem.Altura = this.Altura;
            return triagem;
        }

        internal Triagem CreateTriagem(RzCorportativo.DataAccess.Triagem item)
        {
            Triagem triagem = new Triagem();
            triagem.TriagemId = item.TriagemId;
            triagem.Temperatura = item.Temperatura;
            triagem.PressaoArterial = item.PressaoArterial;
            triagem.Peso = item.Peso;
            triagem.Observacoes = item.Observacoes;
            triagem.FrequenciaCardiaca = item.FrequenciaCardiaca;
            triagem.ConsultaId = item.ConsultaId;
            triagem.Altura = item.Altura;
            return triagem;
        }

        public static List<Triagem> Listar(Triagem triagem)
        {
            if (triagem == null)
                triagem = new Triagem();
            List<Triagem> triagens = new List<Triagem>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            triagens = db.Triagem.Where(w =>
                    ((triagem.TriagemId == 0) || (triagem.TriagemId == w.TriagemId)) &&
                    ((triagem.ConsultaId == 0) || (triagem.ConsultaId == w.ConsultaId)) 
                ).ToList().Select(s => triagem.CreateTriagem(s)).ToList();
            return triagens;
        }
    }
}
